package com.example.lib.c2.pc0;

/**
 * 类锁
 */
public class Main1ClassLock {
    private static Main1ClassLock classLock;

    //不安全
    public static Main1ClassLock getInstance() {
        //任何线程都能进来
        if (classLock == null) {
            // 1  线程1  cpu执行器被操作系统调度给释放 暂停      3 获得cpu执行权  恢复 继续向下走 又new一次
            classLock = new Main1ClassLock();  // 2 线程2 cpu执行了一次  new一次
        }
        return classLock;
    }

    //synchronized 是隐式锁 ，  锁定 解锁 我们不到 也改不了， jdk 内部定义的， 也称为 内置锁
    //性能低
    //这是静态方法，属于Main1ClassLock.class的， 所以synchronized 持有Main1ClassLock.class的锁
    public synchronized static Main1ClassLock getInstance1() {
        //任何线程都进不来
        if (classLock == null) {
            classLock = new Main1ClassLock();
        }
        return classLock;
    }//线程1 执行完 释放锁

    //双重检测 处理安全 懒加载方式
    public static Main1ClassLock getInstance2() {
        if (classLock == null) {
            // 线程2 3 4 5 6 在这里
            synchronized (Main1ClassLock.class) {
                // 线程1在这
                if (classLock == null) {
                    classLock = new Main1ClassLock();
                }
            }//线程1执行完
        }
        return classLock;
    }
}
